package list;

/**
 * @author 陈艺博
 * @date 2021-02-08 16:09
 * @description 抽象类， 放子类公共的实现方法
 */
public abstract class AbstractList<E> implements List<E> {

    protected int size;

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    @Override
    public void add(E element) {
        add(size, element);
    }

    /**
     * 数组下标越界提示信息
     *
     * @param index 下表
     */
    protected void outOfBound(int index) {
        throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
    }

    /**
     * 检查下标是否越界
     *
     * @param index 容量[0,size)
     */
    protected void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBound(index);
        }
    }

    /**
     * 判断容量是否越界
     *
     * @param index [0,size]
     */
    protected void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBound(index);
        }
    }
}
